package org.loon.framework.android.game.action.sprite;

import java.io.Serializable;

import org.loon.framework.android.game.core.LRelease;
import org.loon.framework.android.game.core.geom.RectBox;
import org.loon.framework.android.game.core.graphics.opengl.GLEx;
import org.loon.framework.android.game.core.graphics.opengl.LTexture;

/**
 * Copyright 2008 - 2011
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
/**
 * 
 * ISprite是一个接口类，本身并不实现具体的业务，然而它却是所有精灵的基础，任何精灵
 * 都必须实现ISprite才能被LGame 当作精灵类使用并有效管理。
 * 
 * @project loonframework
 * @author chenpeng
 * @email：ceponline@yahoo.com.cn
 * @version 0.1
 */
public interface ISprite extends Serializable, LRelease {

	public static final int TYPE_FADE_IN = 0;

	public static final int TYPE_FADE_OUT = 1;

	/**
	 * 返回当前精灵的宽度。
	 * @return
	 */
	public abstract int getWidth();

	/**
	 * 返回当前精灵的高度。
	 * @return
	 */
	public abstract int getHeight();

	/**
	 * 返回当前精灵的透明度。
	 * @return
	 */
	public abstract float getAlpha();

	/**
	 * 返回当前精灵的x 轴坐标(int形式)。
	 * @return
	 */
	public abstract int x();

	/**
	 * 返回当前精灵的y轴坐标(int形式)。
	 * @return
	 */
	public abstract int y();

	/**
	 * 返回当前精灵的x 轴坐标(double形式)。
	 * @return
	 */
	public abstract float getX();

	/**
	 * 返回当前精灵的y轴坐标(double形式)。
	 * @return
	 */
	public abstract float getY();

	/**
	 * 设定当前精灵是否可见。
	 * @param visible
	 */
	public abstract void setVisible(boolean visible);

	/**
	 * 获得当前精灵是否可见。
	 * @return
	 */
	public abstract boolean isVisible();

	/**
	 * 精灵底层绘制接口，可在此覆盖或修饰原有精灵画面。
	 * @param g
	 */
	public abstract void createUI(GLEx g);

	/**
	 * 精灵用计时器，每当发生时间变化时此函数将被触发，也可
	 * 以手动触发此函数引发精灵变动。
	 * @param elapsedTime
	 */
	public abstract void update(long elapsedTime);

	/**
	 * 获得当前精灵所在层，层变动将直接影响精灵事件。
	 * @return
	 */
	public abstract int getLayer();

	/**
	 * 设定当前精灵所在层。
	 * @param layer
	 */
	public abstract void setLayer(int layer);

	/**
	 * 返回当前精灵碰撞盒。
	 * @return
	 */
	public abstract RectBox getCollisionBox();

	public abstract LTexture getBitmap();

}
